/*
 * Parser.cpp
 *
 */

#include "Parser.h"

Parser::Parser(){

}


/* A partir del parametro de entrada crea una list con todas las palabras
 * stopwwords
 * inicializa la cantidad de palabras a 0
 * parametros de entrada: nombre del archivo stopwords
 * parametros de salida: -
 */

Parser::Parser(string nombre_arch_stopwords){

    this->stopW = new stopwords(nombre_arch_stopwords);
    this->cant_palabras = 0;
}

/* creo una lista y por cada archivo parseado devuelvo una lista de palabras que
 * meto en la primera lista, quedandome así una matriz
 */
list< listaDeRegPalabras >* Parser::parsearListado(list<string> *lista_path){
    list<list<RegistroPalabra> > *matriz = new list< list<RegistroPalabra> >();
	list<string>::iterator it_lista_path;
	it_lista_path = lista_path->begin();
	//recorro toda la lista de path
    for (it_lista_path = lista_path->begin();it_lista_path != lista_path->end();it_lista_path++){
		matriz->push_back(this->Procesa_palabras((*it_lista_path)));
	}
	return matriz;
}

/**Procesa_palabras()
 * Compara la lista de stopwords con la lista que arma con las palabras ubicadas en path
 * devuelve una lista resultado con las palabras
 * del libro que no son stopwords
 *
 * parametros de entrada: lista de palabras a procesar
 * parametros de salida: lista resultado, sin stopwords
 */

list<RegistroPalabra> Parser::Procesa_palabras(string path){

	    list<string>::iterator it_libro;
	    list<string> *stopwords;

	 	list<string>::iterator it_stopW;
	 	list<RegistroPalabra> Lista_resultado;

	 	Utilidad *uti = new Utilidad();
	    bool encontrada;
	    string palabra;
	    //armo la lista de palabras que estan en path
	    list<string>* Lpalabras = new list<string>();
	    Lpalabras = this->armarLista(path);

        // me cargo la lista de las stopwords
	    stopwords = this->stopW->obtener_stopwords();

	    it_libro = Lpalabras->begin();

        while (it_libro != Lpalabras->end()){

	     	it_stopW = stopwords->begin();
	     	encontrada = false;
	     	palabra = uti->downcase(*it_libro);
            // busco la palabra en las stopwords
	     	while ((it_stopW != stopwords->end()) && (encontrada == false)){
	      	   if (palabra == *it_stopW){
	     	   encontrada = true;
	      	   }
	     	   it_stopW++;
	     	}

	     	if (encontrada == false){ //si no esta en las stopW
	     		RegistroPalabra *regP = new RegistroPalabra(*it_libro);
	     		//veo si ya esta en la lista_resultados
	    	 	list<RegistroPalabra>::iterator it_resultados;
	     		it_resultados = Lista_resultado.begin();
	     		bool esta = false;
	     		while((it_resultados != Lista_resultado.end()) && (!esta)){
	     			if((*it_resultados).getPalabra() == *it_libro){
	     				esta = true;
	     				(*it_resultados).inc_repeticiones(); //si ya estaba solo le incr la cant de apariciones
	     			}
	     			it_resultados++;
	     		}
	     		if(!esta){ //si no esta entonces si agrego el registro
	     		Lista_resultado.push_back(*regP);
	     		this->cant_palabras += 1;
	     		}
	     	}
	     it_libro++;
	     }
	 	return Lista_resultado;

}

/* recibe la ruta de un archivo y devuelve un puntero a una lista de todas las palabras del archivo */
list<string>* Parser::armarLista(string path_arch){
	Utilidad uti;
	char *cstr, *p;
    list<string> *lista_palabras = new list<string>();
	ArchivoTexto *arch_txt = new ArchivoTexto(path_arch);
	string libro = arch_txt->obtener_words();

	cstr = new char[libro.size()+1];

    strcpy (cstr, libro.c_str());
    p = strtok (cstr," ");
    while (p != NULL)
	{
    	string unaPalabra = uti.quitar_invalidos((uti.quitar_acentos(uti.downcase(p))));
    	if(unaPalabra != ""){
        lista_palabras->push_back(unaPalabra);
    	}
//        lista_palabras->push_back(((uti.quitar_acentos(uti.downcase(p)))));
	    p = strtok (NULL, " ");
	 }
    return lista_palabras;
}


/*igual que el anterior pero a este se le pasa la consulta como un string y me devuelve una lista formada por
 * todos los terminos de la consulta en minuscula y sin acentos
 */
list<string>* Parser::obtenerListaDeConsulta(string consulta){
	Utilidad uti;
    char *cstr, *p;
    list<string> *lista_palabras = new list<string>();
	cstr = new char[consulta.size()+1];

    strcpy (cstr, consulta.c_str());
    p = strtok (cstr," ");
    while (p != NULL)
	{
       lista_palabras->push_back(uti.quitar_invalidos(uti.quitar_acentos(uti.downcase(p))));
	   p = strtok (NULL, " ");
	 }
    return lista_palabras;
}

/**get_cant_palabras()
 * obtiene la cantidad total de palabras  del libro que no son
 * stopwords
 * parametros de entrada: -
 * parametros de salida: cantidad de palabras
 *
 */
int Parser::get_cant_palabras(){

	return this->cant_palabras;
}
